home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 32 / Amiga Format AFCD32 (Nov 1998, Issue 117).iso / -seriously_amiga- / programming / amos / a3dsimple-sim / simplesim.amos / simplesim.amosSourceCode < prev    next >
AMOS Source Code  |  1998-08-10  |  42KB  |  1,484 lines

  1. Set Buffer 34
  2. '
  3. Colour 1,$456
  4. Hide 
  5. Curs Off 
  6. '
  7. '
  8. '' 
  9. 'Poke $DFF1DC,32 
  10. Screen Open 1,50,25,16,Lowres : Rem for distant obs
  11. D$=Dir$
  12. Load D$+"banks/jetnoises.abk",5
  13. '  
  14. LONGTH=500 : Rem 500  
  15. Reserve As Chip Work 6,LONGTH
  16. X=0 : CHANGE=12 : Rem 120 was ok 8 
  17. TIME=LONGTH/160 : WHAT=0 : Rem 160,- 100 div gave even result larger=higher 86  
  18. For I=0 To LONGTH-1
  19.    Inc WHAT
  20.    X=X+CHANGE
  21.    If WHAT=TIME Then CHANGE=-CHANGE : WHAT=0
  22.    Y=X
  23.    Poke Start(6)+I,Y
  24. Next 
  25. For S=0 To LONGTH-1 Step 2 : Rem 2
  26.    Poke Start(6)+S,Rnd(12) : Rem 12   
  27. Next 
  28. Dim OBS$(20) : Dim OBN(40,40) : Dim OBX(40,40) : Dim OBY(40,40)
  29. Dim CAN(40,40) : Dim DRX(58) : Dim DRY(58)
  30. Dim LINX(70) : Dim LINY(70) : Dim LINX2(70) : Dim LINY2(70)
  31. Dim TARGX(20) : Dim TARGY(20) : Dim TMPX(20) : Dim TMPY(20)
  32. Dim STATEX(50) : Dim STATEY(50)
  33. Dim SYN#(361)
  34. Dim COZN#(361)
  35. COMMENCE:
  36. HYTE=125 : BXHYT=HYTE/2 : WIPEOUT=(HYTE)*40
  37. Screen Open 2,320,256,16,Lowres
  38. Screen Hide 2
  39. Cls 2 : Get Bob 2,24,0,0 To 55,42
  40. Load Iff "work:pictures-amos/cockpit4"
  41. Get Block 1,40,176,246,10,1
  42. '
  43. Screen Open 4,320,200,16,Lowres : Rem to make map and   space?? for 3d over-writing bug  
  44. Colour 1,$456
  45. Screen Open 3,320,256,16,Lowres : Rem 3D screen  
  46. Screen Hide 3
  47. '
  48. Curs Off 
  49. Screen Copy 2,0,0,320,256 To 3,0,HYTE-183 : Rem Adds cockpit Picture   
  50. Ink 6 : Draw 204,160 To 204,180 : Rem fuel bar 
  51. Screen 1 : Cls 11 : Ink 0
  52. Screen 3
  53. '    above is for distant obs effect 
  54. For Z=0 To 40 : For T=0 To 40 : OBN(Z,T)=40 : Next : Next 
  55. 'above sets array if not loaded
  56. '
  57. '
  58. Gosub SETUP
  59. Gosub LINES
  60. Gosub STRUTS
  61. Gosub INDATA
  62. Gosub MAKETARGET
  63. Gosub AIR
  64. Gosub MAP
  65. Screen Show 3
  66. Autoback 1 : Locate 5,20 : Print TIMEBETWEEN;" " : Gosub WHATSUP : Autoback 0
  67. K=Timer
  68. Sprite 2,220,41,3 : Rem for simple hud display and sight   
  69. Sprite 4,350,41,3
  70. Sprite 6,281,41,4
  71. Screen Show 3
  72. DURATION=0
  73. '             ---------------  some sound  
  74. Volume 0 : Sam Loop On 
  75. Sam Play %1000,1,15000 : Rem   roar dff0d6
  76. Sam Play %100,1,15000 : Rem  roar out of sync  dff0c6 doubled for explode  
  77. Sam Raw %1,Start(6),Length(6),3200 : Rem   turbine  whistle dff0a6  
  78. '  %10     dff0b6 for missile and bang 
  79. '                           ------------ 
  80. '
  81. '
  82. STAARTOFLOOP:
  83. Timer=0
  84. '/////////////////////////////////////////////////////////////////////////// 
  85. '///////////////////////////////////////////////////////////////////////// 
  86. Repeat 
  87.    '
  88.    If WINN=1 Then Gosub WIN
  89.    Gosub STICKREAD
  90.    '
  91.    F$=Inkey$ : Clear Key 
  92.    If F$<>"" Then Gosub KEYBOARD
  93.    '
  94.    If SPEED<POWER*5 Then Add SPEED,2
  95.    If SPEED>(POWER*5)
  96.       Add SPEED,-1
  97.       If SPEED>100 : Add SPEED,-1 : End If 
  98.       If SPEED<5 : SPEED=0 : POWER=0 : End If 
  99.    End If 
  100.    '
  101.    If WZ<40 Then Gosub KRUNCH : Rem   if hit ground
  102.    '
  103.    '
  104.    Gosub ADJUSTVW
  105.    '
  106.    Dec ECHECK : If ECHECK<1 Then Gosub ENEW : Rem ememy PLANE
  107.    Gosub PLANEADJUST : Rem enemy plane speed etc  
  108.    '  
  109.    Colour 10,$9A8 : If WZ<700 Then Colour 10,$9A9 : Rem try9a8 
  110.    OX=DX : OY=DY
  111.    AHED=DHEAD+(WZ*3)
  112.    If WZ<1500 Then Add AHED,2000
  113.    '
  114.    MX= Extension_4_03BA(0,SIDE,0,AHED)
  115.    MY= Extension_4_03C8 : Rem -negative offset if needed by SIDE       
  116.    DX=(MX/GRIDSIZE)-MORRE
  117.    DY=(MY/GRIDSIZE)-MORRE
  118.    OFFX=0
  119.    OFFY=0
  120.    If DX>OX Then Gosub OBNS2
  121.    If DX<OX : If GROBS=3 : OFFX=1 : End If : Gosub OBNS2 : End If 
  122.    If DY>OY Then Gosub OBNS2
  123.    If DY<OY : If GROBS=3 : OFFY=1 : End If : Gosub OBNS2 : End If 
  124.    '
  125.    TARMX= Extension_4_03BA(0,SIDE,0,AHED+FARHEAD)
  126.    TARMY= Extension_4_03C8 
  127.    FARX=(TARMX/GRIDSIZE)
  128.    FARY=(TARMY/GRIDSIZE)
  129.    '' 
  130.    If WHOLD>0
  131.       Dec WHOLD
  132.       If WHOLD=1
  133.          Sam Play %100,1,15000 : Rem  roar out of sync back on after explode  
  134.          Volume %110,0 : Rem and turn down looped explode sound !##$@!
  135.       End If 
  136.    End If 
  137.    If GUH>13 and BANG=0 Then Volume %10,0 : Rem prevents whosh repeating 
  138.    If GUH=MISSTEP
  139.       GUH=0
  140.        Extension_4_0090 1 : Rem kill missile at end of run 
  141.    End If 
  142.    '
  143.    If XFIRE>15 and GUH=0 Then Gosub LAUNCH
  144.    '
  145.    If GUH<MISSTEP and GUH>0
  146.       Inc GUH : Extension_4_0100 1,MISSMOVE : Inc IT : Extension_4_05E2 1,0,IT
  147.       '        i.e.  goes misstep steps at 1000 units = range18,000        
  148.       CLONK= Extension_4_0344(1) : Rem        in case of other use  
  149.       If CLONK>1 and CLONK<20 : Rem so missile doesn't 'hit' launching plane   
  150.          Gosub TIDY : Rem to do  plane or remove targets and update arrays       
  151.       End If 
  152.    End If 
  153.    If Extension_4_0344(0)>1 Then Gosub KRUNCH
  154.    '
  155.    'Gosub WIPE : Rem use for extra speed if fast ram?   
  156.     Extension_4_053C 
  157.    Gosub HORIZON
  158.     Extension_4_0318 
  159.    ' Gosub SKY
  160.    '
  161.    Rem ink 2 goes behind hills,roads, not trees/ 4 behind hills/6 ditto/    
  162.    '
  163.    '        on  runway  changes ...  when fairly near           
  164.    If WX>96000 and WX<109000 : Rem exact 98000 and 107000 
  165.       If WY>103400 and WY<108200 : Rem exact 105400 and 106200
  166.          Gosub RUUNWAY
  167.       End If 
  168.    End If 
  169.    '
  170.    If SPEED<65 and TAKEOFF=1 : Rem does a nose down at stallish speed 
  171.       DROP=-65+SPEED
  172.       B=B+DROP
  173.        Extension_4_0100 0,-DROP
  174.    End If 
  175.    '
  176.    Gosub BLOBS
  177.    '
  178.    Dec HOLD
  179.    If HOLD<0 Then Gosub MAP : HOLD=7 : Rem does map and work not needed every frame 
  180.    If BANG=1 Then Gosub YAY
  181.    Pen HAPPEN
  182.    Locate 29,14 : Print DAMAGE/4;"%"
  183.    If GOTCHA=1 Then Gosub HITBITS
  184.    If SSHOW=-1 Then Locate 13,0 : Print "near boundary "
  185.    Paper 0
  186.    Pen 2
  187.    Locate 7,14 : Print SPEED*2;
  188.    'Locate 6,30 : Print POWER;"  "; 
  189.    YUK:
  190.    If Timer<3 Then Goto YUK
  191.    ' Locate 0,0 : Print 50/Timer; 
  192.    Timer=0
  193.    Doke $DFF0A6,250-(POWER*1.3) : Rem  freq for whistle noise      
  194.    '                                  250-(POWER*1.3) 
  195.    '  
  196.    Screen Swap 
  197.    Wait Vbl 
  198. Until False
  199. '.............................................................             
  200. '              END LOOP            END LOOP
  201. '/////////////////////////////////////////////////////////////////////////// 
  202. '/////////////////////////////////////////////////////////////////////////// 
  203. SETUP:
  204. 'objects.. 0(view)  1 (missile), 18 runway, 19 (target plane),  20 sky         
  205. '            from  2 up  to number 13   ( 11 max    ground objects)            
  206. '   should be 3 spare (say 15,16,17, ?) for missile, more ememy or something   
  207. '  
  208. RT1=16384 : RT2=32768 : RT3=49152 : RT4=65536 : MOREOFF=0
  209. STX=99000 : STY=105800 : STZ=60 : STC=RT1 : WZ=STZ : RAYNG=53000
  210. ENMGOT=0 : ENMHIT=0 : DAMAGE=0 : RELSCALE=5000 : WINN=0 : FATAL=400
  211. '
  212. TRACK=0 : DIFFICULTY=45 : Rem 45 this is frames between replacing targets.     
  213. MISSION=1 : BOOST=0
  214. TIMEBETWEEN=120 : Rem  frames before enemy plane re appears  start value 120     
  215. TRAIN=1 : ROOMX=STX-30000 : ROOMX2=STX+35000 : ROOMY=STY-30000 : ROOMY2=STY+30000
  216. SPEED=0 : POWER=0 : TAKEOFF=0 : MISSTEP=20 : MISSMOVE=1000 : FUEL=RAYNG
  217. GRIDSIZE=5000 : SIDE=0 : ENEMYSPEED=320 : HOLD=0 : ELIMIT=6000 : Rem 11000
  218. '
  219. GROBS=2 : Rem If GROBS<1 Then GROBS=1  
  220. MORRE=1 : RemIf GROBS=1 Then MORRE=2 
  221. DHEAD=6000 : If GROBS=2 Then DHEAD=3000 : FARHEAD=15000
  222. NUMOBS=(GROBS+1)*(GROBS+1) : Rem  objects 4 at grobs1, then 9 then 16   
  223. OLDOB=0 : OB=0 : Rem             but note there are extra perimeter obs.
  224. '
  225. LIMROLL=12000 : Rem limit of roll!   
  226. LIMELEV=7000 : Rem limit elevation angle .. surprise  
  227. ' Gosub SETOBS 
  228. 'Hide  
  229. Degree 
  230. For X=0 To 360 : SYN#(X)=Sin(X) : COZN#(X)=Cos(X) : Next 
  231.  Extension_4_04D6 D$+"objects"
  232.  Extension_4_0054 HYTE
  233. '
  234. Double Buffer 
  235. Autoback 0
  236. 'Screen Close 4
  237. SPEED=0
  238. DISPLACE=500000
  239.  Extension_4_0558 
  240. '
  241.  Extension_4_0016 "horizon"
  242.  Extension_4_0016 "jetplansim1"
  243.  Extension_4_0016 "missile1"
  244.  Extension_4_0016 "roadwd"
  245.  Extension_4_0016 "hedge"
  246.  Extension_4_0016 "road"
  247.  Extension_4_0016 "shortrd"
  248.  Extension_4_0016 "doublehedge"
  249.  Extension_4_0016 "paddock"
  250.  Extension_4_0016 "lowhill"
  251.  Extension_4_0016 "mountain2"
  252.  Extension_4_0016 "smallbuild"
  253.  Extension_4_0016 "squarepair"
  254.  Extension_4_0016 "mast3"
  255.  Extension_4_0016 "trepad"
  256. '   now obs for second set 
  257.  Extension_4_0016 "runtriple"
  258.  Extension_4_0016 "urb1"
  259.  Extension_4_0016 "riverstrt"
  260.  Extension_4_0016 "rivercurve"
  261.  Extension_4_0016 "cliffedge"
  262.  Extension_4_0016 "cliffedge2x"
  263.  Extension_4_0016 "farm"
  264.  Extension_4_0016 "rounderhill"
  265.  Extension_4_0016 "village"
  266.  Extension_4_0016 "longhill"
  267. '
  268. '
  269. OBS$(0)="roadwd"
  270. OBS$(1)="hedge"
  271. OBS$(2)="doublehedge"
  272. OBS$(3)="paddock"
  273. OBS$(4)="lowhill"
  274. OBS$(5)="smallbuild"
  275. OBS$(6)="mountain2"
  276. OBS$(7)="squarepair"
  277. OBS$(8)="mast3"
  278. OBS$(9)="trepad"
  279. '
  280. '
  281. OBS$(10)="runtriple"
  282. OBS$(11)="rivercurve"
  283. OBS$(12)="urb1"
  284. OBS$(13)="riverstrt"
  285. OBS$(14)="cliffedge"
  286. OBS$(15)="farm"
  287. OBS$(16)="cliffedge2x"
  288. OBS$(17)="rounderhill"
  289. OBS$(18)="village"
  290. OBS$(19)="longhill"
  291.  Extension_4_0036 20,"horizon",5400,0,50,RT3,0,RT1
  292.  Extension_4_058A 20,-2
  293.  Extension_4_0036 19,"jetplansim1",30,60,1800,RT1,RT2+4000,0
  294.  Extension_4_0328 19,0,0,0,0,10
  295.  Extension_4_0328 0,0,0,0,0,400 : Rem for hit mount  
  296. '
  297. Gosub CULOR
  298. TURN=STC
  299.  Extension_4_01A6 0,RT3,0,STC
  300.  Extension_4_00EC 0,STX,STY,STZ
  301. Flash Off 
  302. '
  303. Gosub RAYN
  304. Set Rainbow 0,0,600,"(45,-1,1)","(45,-1,1)","(40,-1,1)"
  305. Rainbow 0,420,50+HYTE,145
  306. '
  307. Gosub STRUTS
  308. Gosub DRECSHUN
  309. Return 
  310. '==============================================================================
  311. STICKREAD:
  312. '
  313. XFIRE=Joy(1)
  314. MORE=0 : OLDB=B
  315. If Jleft(1)=-1 Then Add A,-430 : Rem for roll was 300   
  316. If Jright(1)=-1 Then Add A,430
  317. A=A-A/3 : Rem was /4 
  318. If Jup(1)=-1 and WZ>65 Then Add B,-200 : Rem for elevation down was 150 
  319. If Jdown(1)=-1 and SPEED>50 Then Add B,200 : Rem for up 
  320. B=B-B/3
  321. '           for plain a1200 a=600, b300 ,inertia /3
  322. Return 
  323. '====================================================================
  324. KEYBOARD:
  325. '                          
  326. '
  327. If F$="a" and POWER<90 and FUEL>2300
  328.    Add POWER,1
  329. End If 
  330. '
  331. If F$="s" and POWER>0
  332.    Add POWER,-1
  333.    If POWER<5 : POWER=0 : End If 
  334. End If 
  335. '
  336. If SPEED<0 Then SPEED=0
  337. If SPEED>450 Then SPEED=450
  338. '
  339. If F$="x"
  340.    RELSCALE=RELSCALE+1500
  341.    If RELSCALE>5000 : RELSCALE=5000 : End If 
  342.    Gosub RELTARGETS
  343. End If 
  344. If F$="z"
  345.    RELSCALE=RELSCALE-1500
  346.    If RELSCALE<2000 : RELSCALE=2000 : End If 
  347.    Gosub RELTARGETS
  348. End If 
  349. '
  350. If F$="l" Then Gosub LOWED
  351. If F$="p"
  352.    Autoback 1 : Locate 15,2 : Print "PAUSED" : Autoback 0
  353.  Volume 0
  354.  Wait Key : K=Timer
  355. End If 
  356. If F$="c" Then Volume 0 : End 
  357. If F$="4"
  358.     Extension_4_01A6 19,RT1,RT2+EBNK,CAT+RT2
  359.    EHEAD=CAT+RT2
  360.     Extension_4_00EC 19,WX,WY,WZ : Extension_4_0100 19,4000
  361. End If 
  362. If F$="1" Then MAPTYPE=0
  363. If F$="2" Then MAPTYPE=1
  364. If F$="3" Then MAPTYPE=2
  365. If F$="k" Then Gosub KALASET
  366. If F$="d" Then Gosub DSOBS
  367. If F$="," Then DHEAD=DHEAD-500
  368. If F$="." Then DHEAD=DHEAD+500
  369. If F$="8" Then Gosub NEWPLANE
  370. If F$="m"
  371.    Add TIMEBETWEEN,20
  372.   If TIMEBETWEEN>180 : TIMEBETWEEN=180 : End If 
  373.    Autoback 1 : Locate 5,20 : Print TIMEBETWEEN;" " : Autoback 0
  374. End If 
  375. If F$="n"
  376.    Add TIMEBETWEEN,-20
  377.   If TIMEBETWEEN<0 : TIMEBETWEEN=0 : End If 
  378.    Autoback 1 : Locate 5,20 : Print TIMEBETWEEN;" " : Autoback 0
  379. End If 
  380. '
  381. If F$="r" Then Gosub AGAIN : Rem        ......  reset if plane lost 
  382. Return 
  383. '========================================================================
  384. ADJUSTVW:
  385. '
  386. '                
  387. '
  388. UUZ1#=COZN#(BAT/182) : Rem angle B is roll, angle  A elevation  
  389. UUZ2#=SYN#(BAT/182)
  390. UUZ3#=COZN#(AAT/182)
  391. ERK#=UUZ1#*UUZ1#*UUZ1#
  392. ' INVERT=1 : If BAT>RT1 and BAT<RT3 Then INVERT=-1 
  393. '
  394. GOING=GOING+B : Rem non-roll control   
  395. ' GOING=GOING+(B*Abs(erk#))*INVERT : Rem alternate roll control    
  396. '      above extra uuz1#'s to stop joy up/down changing attitude too much    
  397. '   when applied in bank    and showing once it comes back level   
  398. '    
  399. If GOING>LIMELEV-500 : B=B/4 : End If : Rem these slow then stop elevation change
  400. If GOING>LIMELEV : GOING=LIMELEV : End If 
  401. If GOING<-LIMELEV+500 : B=B/4 : End If 
  402. If GOING<-LIMELEV : GOING=-LIMELEV : End If 
  403. If WZ>5500 and GOING>0
  404.    GOING=GOING-200 : B=-150 : Rem to limit altitude
  405. End If 
  406. '
  407. If TAKEOFF=1
  408.    TURN=TURN+(500*UUZ2#)+(A*Abs(UUZ3#)) : Rem    non roll control    
  409.    '              ^for auto turn      ^ for correction of initial skew when nose
  410.    '                                pointed up or down      
  411.    'TURN=TURN+(200*UUZ2#)+(B*UUZ2#) : Rem alternate roll control    
  412.    ' above  provides increasing auto turn on bank + joystick up /down extra   
  413.    '
  414.    ROLL=ROLL+A
  415.    If ROLL>LIMROLL-2000 : A=A/4 : End If : Rem  rem these out for roll style  
  416.    If ROLL<-LIMROLL-2000 : A=A/4 : End If : Rem           control system   
  417.    If ROLL>LIMROLL : ROLL=LIMROLL : End If 
  418.    If ROLL<-LIMROLL : ROLL=-LIMROLL : End If 
  419. End If 
  420. '
  421. '
  422. ' ELEVATION=GOING*UUZ1# : Rem   For roll control System uuz1# to reverse vert 'screw'    
  423. '
  424. THING=(GOING/3)*ERK# : Rem this reduces roll caused lunge at elevation extremes     
  425. ELEVATION=GOING-THING : Rem non  roll system 
  426. '
  427.  Extension_4_01A6 0,RT3+ELEVATION,ROLL,TURN
  428.  Extension_4_0100 0,SPEED
  429. '      ..........................
  430. '
  431. AAT= Extension_4_01BC(0)
  432. BAT= Extension_4_01D0(0)
  433. CAT= Extension_4_01E4(0)
  434. WX= Extension_4_0114(0) : WY= Extension_4_0128(0) : WZ= Extension_4_013C(0)
  435. '
  436. Return 
  437. '===================================================================== 
  438. LAUNCH:
  439. '
  440. Volume %10,40 : Sam Play %10,2,16000
  441.  Extension_4_0036 1,"missile1",WX,WY,WZ-200,AAT,BAT,CAT
  442.  Extension_4_0328 1,0,0,0,1000,1000
  443.  Extension_4_0328 1,1,0,0,-1000,1000
  444.  Extension_4_0328 1,2,0,0,0,1000
  445.  Extension_4_0100 1,300
  446. GUH=1
  447. '
  448. Return 
  449. '
  450. '==============================================================
  451. SKY: Rem  test one only 
  452. Ink 9
  453. TH=BAT/50
  454. If BAT>RT2 Then TH=-(RT4-BAT)/50
  455. If TH<-140 Then TH=-140
  456. If TH>140 Then TH=140
  457. Polygon 2,2 To 318,2 To 318,50-TH To 2,50+TH To 2,2
  458. Return 
  459. '==================================================================
  460. HORIZON:
  461.  Extension_4_00EC 20,WX,WY,WZ+157
  462.  Extension_4_01A6 20,RT3,0,CAT
  463.  Extension_4_0100 20,160
  464. Return 
  465. '=========================================================== 
  466. STRUTS:
  467. Hide 
  468. Set Sprite Buffer 250
  469. Get Sprite 2,3,100,60 To 108,185 : Rem left strut       
  470. Get Sprite 2,4,155,73 To 170,160 : Rem sight    
  471. HUD=1
  472. '
  473. For FT=0 To 12 Step 4
  474.    Colour 17+FT,$555 : Rem  sprite colour 
  475.    Colour 18+FT,$0 : Rem  odd blue bit? 
  476.    Colour 19+FT,$0 : Rem  
  477. Next 
  478. Return 
  479. '=========================================================================== 
  480. CULOR:
  481. '  ......  greenish landscape......
  482. Colour 0,$573 : Rem backgrnd=ground  was683
  483. Colour 1,$121 : Rem cpit deep  radar back ground 
  484. Colour 2,$343 : Rem cpit grey  
  485. Colour 3,$ED9 : Rem cpit bright
  486. Colour 4,$885 : Rem cpit mid surface 
  487. Colour 5,$4F5 : Rem cpit green marks 
  488. Colour 6,$2FF : Rem map pilot position and arrow   
  489. Colour 7,$FF0 : Rem map airport
  490. '   .......  objects........ 
  491. Colour 8,$164 : Rem trees double side  154 
  492. Colour 9,$488 : Rem sky     7cd .488 blends better 3d depth or 49A       
  493. Colour 10,$8A8 : Rem 8a9 road top (& a field), building wall airstrip abb     
  494. Colour 11,$685 : Rem  distant blobs + top of cliffy thing 585 
  495. Colour 12,$896 : Rem field and build top bright face mount  896 
  496. Colour 13,$257 : Rem
  497. Colour 14,$465 : Rem shadow -dark 375 
  498. '     extra
  499. Colour 15,$F28 : Rem enemy and target  position spots   and Power   
  500. Return 
  501. '===================================================================== 
  502. SPOTS:
  503. CHEEX=WX and 8192
  504. CHEEY=WY and 8192
  505. If LOCK<1
  506.    If CHEEX=8192 or CHEEY=8192
  507.       OLDEX= Extension_4_03BA(0,0,0,30000)
  508.       OLDEY= Extension_4_03C8 
  509.       LOCK=15
  510.    End If 
  511. End If 
  512. '
  513. Dec LOCK
  514. Ink 6
  515. For PX=-10240 To 10240 Step 8192
  516.    For PY=-10240 To 10240 Step 8192
  517.       USEX= Extension_4_0474(OLDEX+PX,OLDEY+PY,0)
  518.       USEY= Extension_4_0480 
  519.       Plot USEX,USEY : Plot USEX+1,USEY : Plot USEX+3,USEY
  520.    Next PY
  521. Next PX
  522. Return 
  523. '==========================================================================
  524. SETOBS: Rem          .......does rnd  obs on test
  525. OB1=2
  526. For Y=0 To 40
  527.    For X=0 To 40
  528.       OBN(X,Y)=Rnd(10)
  529.       OBX(X,Y)=(X*GRIDSIZE)
  530.       OBY(X,Y)=(Y*GRIDSIZE)
  531.    Next X
  532. Next Y
  533. Return 
  534. '========================================================================
  535. EXOBS: Rem this is to do distant perimeter selected obs 
  536. '               only in the direction of travel  
  537. '     0=roads  6 =high mounts    8=target   11 water 13 water  
  538. If DX>OX
  539.    TEX=DX+GROBS+1
  540.    '
  541.    For TEY=DY-1 To DY+GROBS+1
  542.       If TEX>-1 and TEX<41 and TEY>-1 and TEY<41
  543.          TMP=OBN(TEX,TEY)
  544.          If TMP=0 or TEMP=6 or TEMP=8 or TEMP=11 or TEMP=13
  545.              Extension_4_0036 OB,OBS$(TMP),OBX(TEX,TEY),OBY(TEX,TEY),0,RT1,RT2,CAN(TEX,TEY)
  546.             Inc OB
  547.          End If 
  548.       End If 
  549.    Next TEY
  550. End If 
  551. '
  552. '
  553. If DX<OX
  554.    TEX=DX-1
  555.    For TEY=DY-1 To DY+GROBS+1
  556.       If TEX>-1 and TEX<41 and TEY>-1 and TEY<41
  557.          TMP=OBN(TEX,TEY)
  558.          If TMP=0 or TEMP=6 or TEMP=8 or TEMP=11 or TEMP=13
  559.              Extension_4_0036 OB,OBS$(TMP),OBX(TEX,TEY),OBY(TEX,TEY),0,RT1,RT2,CAN(TEX,TEY)
  560.             Inc OB
  561.          End If 
  562.       End If 
  563.    Next TEY
  564. End If 
  565. '
  566. '
  567. If DY>OY
  568.    TEY=DY+GROBS+1
  569.    For TEX=DX-1 To DY+GROBS+1
  570.       If TEX>-1 and TEX<41 and TEY>-1 and TEY<41
  571.          TMP=OBN(TEX,TEY)
  572.          If TMP=0 or TEMP=6 or TEMP=8 or TEMP=11 or TEMP=13
  573.              Extension_4_0036 OB,OBS$(TMP),OBX(TEX,TEY),OBY(TEX,TEY),0,RT1,RT2,CAN(TEX,TEY)
  574.             Inc OB
  575.          End If 
  576.       End If 
  577.    Next TEX
  578. End If 
  579. '
  580. If DY<OY
  581.    TEY=DY-1
  582.    For TEX=DX-1 To DY+GROBS+1
  583.       If TEX>-1 and TEX<41 and TEY>-1 and TEY<41
  584.          TMP=OBN(TEX,TEY)
  585.          If TMP=0 or TEMP=6 or TEMP=8 or TEMP=11 or TEMP=13
  586.              Extension_4_0036 OB,OBS$(TMP),OBX(TEX,TEY),OBY(TEX,TEY),0,RT1,RT2,CAN(TEX,TEY)
  587.             Inc OB
  588.          End If 
  589.       End If 
  590.    Next TEX
  591. End If 
  592. Return 
  593. '========================================================================
  594. OBNS2: Rem                ....  this does MAIN OBJECTS  
  595. WATT=0 : Rem to count no of mounts used 
  596. If OB>2
  597.    For R=2 To OB-1 : Extension_4_0090 R : Next 
  598. End If 
  599. SSHOW=1 : If DY<0 or DX<0 or DY>40 or DX>40 Then SSHOW=-1
  600. OB=2
  601. For TEX=DX+OFFX To DX+GROBS+OFFX
  602.    For TEY=DY+OFFY To DY+GROBS+OFFY
  603.       If TEX>-1 and TEX<41 and TEY>-1 and TEY<41
  604.          TMP=OBN(TEX,TEY)
  605.          If TMP<20 and TMP<>10
  606.              Extension_4_0036 OB,OBS$(TMP),OBX(TEX,TEY),OBY(TEX,TEY),0,RT1,RT2,CAN(TEX,TEY)
  607.             '
  608.             If TMP=8 : Rem if target
  609.                 Extension_4_0328 OB,0,0,0,0,50
  610.             End If 
  611.             '
  612.             If TMP=6 : Rem if mount 
  613.                Inc WATT
  614.                 Extension_4_0328 OB,0,0,1000,0,1400
  615.             End If 
  616.             '
  617.             Inc OB
  618.          End If 
  619.       End If 
  620.    Next TEY
  621. Next TEX
  622. Gosub EXOBS
  623. 'OLDOB=OB
  624. Return 
  625. '================================================================= 
  626. '       maps   and all the stuff to save time, not done  every frame   
  627. MAP:
  628. If ENMGOT>2 : ECHECK=90 : EBNK=Rnd(40000)-20000 : End If 
  629. '              above skews  shot down plane
  630. If TRACK=ACOUNT : WINN=1 : End If : Rem  if all targets eliminated 
  631. '  
  632. HAPPEN=2
  633. If FAROUT<2 and FAROUT>-1 Then Inc DAMAGE : HAPPEN=15 : Rem  enemy scores if left free on area   
  634. If DAMAGE>FATAL Then Gosub LOSE
  635. '
  636. FUEL=FUEL-POWER
  637. If FUEL<2300 Then POWER=0
  638. USEFUEL=180-(FUEL/2500)
  639. Gosub RESTATE : Rem check for target replace, or if all gone 
  640. '
  641. Doke $DFF0D6,350-(SPEED/2) : Rem was 350-(speed/2)  freq  
  642. Doke $DFF0C6,320-(SPEED/2) : Rem was 320-(speed/2)  
  643. Volume %1000,28+(SPEED/40) : Rem for air roar 28  
  644. If WHOLD<1 : Rem to allow use for explode noise 
  645.    Volume %100,20+(SPEED/40) : Rem for air roar 20  
  646. End If 
  647. Volume %1,20+(POWER/3) : Rem for whistle
  648. If SPEED<1 Then Volume %1001,12
  649. '
  650. '      to have runway more reliable yet vanish at distance 
  651. If WX>ROOMX and WX<ROOMX2 and WY>ROOMY and WY<ROOMY2 and HAVE=0
  652.     Extension_4_0036 18,OBS$(10),GRIEFX,GRIEFY,0,RT1,RT2,GRIEFC : HAVE=1
  653. End If 
  654. If HAVE=1
  655.    If WX<ROOMX or WX>ROOMX2 or WY<ROOMY or WY>ROOMY2
  656.        Extension_4_0090 18 : HAVE=0 : Rem  runway out of reasonable distance 
  657.    End If 
  658. End If 
  659. '
  660. US=(CAT+RT2)/1820
  661. ENX= Extension_4_0114(19)/5000 : Rem enemy plane grid position  
  662. ENY= Extension_4_0128(19)/5000
  663. BOOST=0
  664. If ENX>38 or ENX<2
  665.    Gosub CHANGE : Rem if near edge   
  666. End If 
  667. If ENY>38 or ENY<2
  668.    Gosub CHANGE
  669.    '            to change enemy 
  670. End If : Rem       when going out of area 
  671. '
  672. If MAPTYPE=1 Then Gosub RELMAP : Return 
  673. If MAPTYPE=2 Then Gosub RELTARGETS : Return 
  674. If ENY<1 Then ENY=1
  675. If ENY>39 Then ENY=39
  676. If ENX<1 Then ENX=1
  677. If ENX>39 Then ENX=39
  678. '
  679. MX=WX/GRIDSIZE
  680. If MX<1 Then MX=1
  681. If MX>39 Then MX=39
  682. '
  683. MY=WY/GRIDSIZE
  684. If MY<1 Then MY=1
  685. If MY>39 Then MY=39
  686. '
  687. TEMPP=POWER/4
  688. Paste Bob 90,150,24
  689. Ink 6
  690. ' Plot 90+OMY,190-OMX : Rem y acts as x and vice versa for 90' rotate  
  691. Plot 90+MY,190-MX : Plot 90+MY,191-MX
  692. Plot 91+MY,190-MX : Plot 91+MY,191-MX
  693. Ink 1 : Draw 204,159 To 204,USEFUEL : Rem fuel bar 
  694. Ink 15
  695. Draw 180,180 To 180,180-TEMPP
  696. If BOOST=0
  697.    Plot 90+ENY,190-ENX : Plot 91+ENY,190-ENX
  698.    Plot 90+ENY,191-ENX : Plot 91+ENY,191-ENX
  699. End If 
  700. Ink 6
  701. Draw YUKX-DRX(US-2),YUKY-DRY(US-2) To YUKX+DRX(US),YUKY+DRY(US)
  702. Draw YUKX-DRX(US+2),YUKY-DRY(US+2) To YUKX+DRX(US),YUKY+DRY(US)
  703. Ink 1
  704. Draw 180,158 To 180,179-TEMPP
  705. Screen Swap 
  706. '
  707. Paste Bob 90,150,24
  708. If BOOST=0
  709.    Ink 15
  710.    Plot 90+ENY,190-ENX : Plot 91+ENY,190-ENX
  711.    Plot 90+ENY,191-ENX : Plot 91+ENY,191-ENX
  712. End If 
  713. Ink 6
  714. Draw YUKX-DRX(US-2),YUKY-DRY(US-2) To YUKX+DRX(US),YUKY+DRY(US)
  715. Draw YUKX-DRX(US+2),YUKY-DRY(US+2) To YUKX+DRX(US),YUKY+DRY(US)
  716. Ink 1 : Draw 204,159 To 204,USEFUEL : Rem fuel bar 
  717. Ink 15
  718. Plot 90+MY,190-MX : Plot 90+MY,191-MX
  719. Plot 91+MY,190-MX : Plot 91+MY,191-MX
  720. Draw 180,180 To 180,180-TEMPP
  721. Ink 1
  722. Draw 180,158 To 180,179-TEMPP
  723. Screen Swap 
  724. '
  725. '
  726. ' OMX=MX2 : OMY=MY2:rem to delay and thence space dots directionaly  
  727. ' MX2=MX : MY2=MY
  728. Return 
  729. '=================================================================== 
  730. FIRSTOB:
  731. OB=2
  732. For TEX=DX To DX+GROBS
  733.    For TEY=DY To DY+GROBS
  734.        Extension_4_0036 OB,OBS$(OBN(TEX,TEY)),OBX(TEX,TEY),OBY(TEX,TEY),0,RT1,RT2,CAN(TEX,TEY)
  735.       Inc OB
  736.    Next TEY
  737. Next TEX
  738. Return 
  739. '===================================================================== 
  740. '                  for manual selection of land data  source 
  741. LOWED:
  742. Screen 4 : Screen To Front 4
  743. Cls 1 : Show : Pen 13
  744. Print "This is to select the arrays needed "
  745. Print "for the 'world' from disk                 "
  746. Print "It will recognize the names starting;- "
  747. Print "    OBN, OBX, OBY, CAN                       "
  748. Print " A  2 place ident.  tag after the "
  749. Print "letters will be used to load all arrays "
  750. Print 
  751. Print " Press a key to continue "
  752. Wait Key 
  753. TEMP$=Dir$
  754. F$=Fsel$("")
  755. If F$="" Then Goto SKIP
  756. TMP$=Right$(F$,5) : OTHER$=Right$(F$,2)
  757. USE$=Left$(TMP$,3)
  758. If USE$="OBN" Then Gosub INDATA : Goto SKIP
  759. If USE$="OBX" Then Gosub INDATA : Goto SKIP
  760. If USE$="OBY" Then Gosub INDATA : Goto SKIP
  761. If USE$="CAN" Then Gosub INDATA : Goto SKIP
  762. SKIP:
  763. Dir$=TEMP$
  764. Screen 3 : Screen To Front 3
  765. Hide 
  766. Gosub OBNS2
  767. Return 
  768. '======================================================================= 
  769. INDATA:
  770. 'TEMP$=Dir$ : Rem this and below was done for quick load/ program developement   
  771. 'Dir$="WORK:amos/amosbanks/" 
  772. OTHER$="01"
  773. Bload D$+"banks/"+"OBN"+OTHER$,Varptr(OBN(0,0))
  774. Bload D$+"banks/"+"OBX"+OTHER$,Varptr(OBX(0,0))
  775. Bload D$+"banks/"+"OBY"+OTHER$,Varptr(OBY(0,0))
  776. Bload D$+"banks/"+"CAN"+OTHER$,Varptr(CAN(0,0))
  777. 'Dir$=TEMP$
  778. Gosub OBNS2
  779. Gosub DETAILMAP
  780. K=Timer
  781. Return 
  782. '
  783. '===================================================================== 
  784. '    If Error  tests 
  785. REGARD:
  786. Cls : Locate 10,10
  787. Print OBS$(OBN(TEX,TEY))
  788. Print TEX;OB;R
  789. Screen Swap : Wait Key 
  790. End 
  791. '=================================================== 
  792. CHICK:
  793. CNT=0
  794. If OB>2
  795.    For GL=2 To OB-1
  796.       If Extension_4_006C(GL)=0
  797.          Inc CNT
  798.       End If 
  799.    Next GL
  800. End If 
  801. Return 
  802. '========================================================================
  803. '
  804. RAYN:
  805. Set Rainbow 1,0,160,"","",""
  806. RD=5 : GN=7
  807. For N=0 To 45 : Rain(1,N)=(RD*256)+(GN*16)+8 : Next 
  808. For N=45 To 75 : Rain(1,N)=(RD*256)+(GN*16)+7 : Next 
  809. For N=75 To 90 : Rain(1,N)=(RD*256)+(GN*16)+6 : Next 
  810. For N=90 To 100 : Rain(1,N)=(RD*256)+(GN*16)+5 : Next 
  811. For N=100 To 135 : Rain(1,N)=(RD*256)+(GN*16)+4 : Next 
  812. Rain(1,43)=(RD*256)+(GN*16)+7
  813. Rain(1,41)=(RD*256)+(GN*16)+7
  814. Rain(1,39)=(RD*256)+(GN*16)+7
  815. Rain(1,73)=(RD*256)+(GN*16)+6
  816. Rain(1,71)=(RD*256)+(GN*16)+6
  817. Rain(1,69)=(RD*256)+(GN*16)+6
  818. Rain(1,88)=(RD*256)+(GN*16)+5
  819. Rain(1,86)=(RD*256)+(GN*16)+5
  820. Rain(1,84)=(RD*256)+(GN*16)+5
  821. Rain(1,98)=(RD*256)+(GN*16)+4
  822. Rain(1,96)=(RD*256)+(GN*16)+4
  823. Rain(1,94)=(RD*256)+(GN*16)+4
  824. Rainbow 1,0,40,120
  825. Return 
  826. '
  827. '==========================================================================
  828. '
  829. DETAILMAP:
  830. Screen 4
  831. Wait 2
  832. Gosub CULOR
  833. For F=25 To 27
  834.    Cls 13
  835.    YUK=2000
  836.    If F=26 Then YUK=4000
  837.    If F=27 Then YUK=6000
  838.    Ink 9 : Circle 20,20,(MISSTEP*MISSMOVE)/YUK
  839.    Plot 20,16-(MISSTEP*MISSMOVE)/2000
  840.    Plot 20,18-(MISSTEP*MISSMOVE)/2000
  841.    Plot 20,22-(MISSTEP*MISSMOVE)/2000
  842.    Plot 20,24-(MISSTEP*MISSMOVE)/2000
  843.    Plot 20,26-(MISSTEP*MISSMOVE)/2000
  844.    Ink 6 : Plot 20,20
  845.    Ink 1 : Bar 41,1 To 59,40
  846.    Get Bob 4,F,0,0 To 56,42 : Rem for relative map 
  847. Next 
  848. '
  849. Cls 13
  850. For Y=0 To 40
  851.    For X=0 To 40
  852.       If OBN(X,Y)=0 : Rem    roads 
  853.          Ink 12
  854.          Plot Y,40-X : Rem y acts as x and vice versa 
  855.       End If 
  856.       '
  857.       If OBN(X,Y)=4 or OBN(X,Y)=6 : Rem low or high hill 
  858.          Ink 1
  859.          Plot Y,40-X
  860.       End If 
  861.       '
  862.       If OBN(X,Y)=12 or OBN(X,Y)=18 : Rem village or urban 
  863.          Ink 5
  864.          Plot Y,40-X
  865.       End If 
  866.       '
  867.       If OBN(X,Y)=10 : Rem airport and to get x,y for rel map spot  
  868.          AIRX=OBX(X,Y)
  869.          AIRY=OBY(X,Y)
  870.          Ink 7
  871.          Plot Y,40-X
  872.          Plot Y,41-X
  873.       End If 
  874.       '
  875.       If OBN(X,Y)=8 : Rem mast target
  876.          Ink 15
  877.          Plot Y,40-X
  878.       End If 
  879.       '
  880.       If OBN(X,Y)=11 or OBN(X,Y)=13 : Rem water course 
  881.          Ink 9
  882.          Plot Y,40-X
  883.       End If 
  884.    Next X
  885. Next Y
  886. Ink 1
  887. Draw 41,0 To 41,41
  888. Circle 49,8,7
  889. Paint 49,8
  890. Get Bob 4,24,0,0 To 56,42
  891. 'Cls 1 
  892. Screen 3
  893. Wait 2
  894. Return 
  895. '======================================================================= 
  896. DRECSHUN: Rem to make simplified direction cos/sin  for map
  897. YUKX=138 : YUKY=158
  898. Degree 
  899. For US=1 To 56
  900.    DRX(US)=(Cos(US*10))*4
  901.    DRY(US)=(Sin(US*10))*4
  902. Next 
  903. Return 
  904. '====================================================================
  905. WIPE:
  906. Fill Logbase(0) To Logbase(0)+WIPEOUT,$0
  907. Fill Logbase(1) To Logbase(1)+WIPEOUT,$0
  908. Fill Logbase(2) To Logbase(2)+WIPEOUT,$0
  909. Fill Logbase(3) To Logbase(3)+WIPEOUT,$0
  910. Return 
  911. '
  912. '
  913. '
  914. '================================================================  
  915. '               add distant background spots 
  916. BLOBS:
  917. If HAVEOBS=1 Then Return 
  918. If WATT>2 Then Return : Rem if at least 3 mountains no blobs 
  919. For NORTH=FARX-2 To FARX+1
  920.    For WEST=FARY-1 To FARY+2
  921.       If NORTH>-1 and NORTH<41 and WEST>-1 and WEST<41
  922.          TMP=OBN(NORTH,WEST)
  923.          POSX= Extension_4_0474(OBX(NORTH,WEST),OBY(NORTH,WEST),0)
  924.          POSY= Extension_4_0480 
  925.          ' If TMP=5 : Rem mountain use large?     
  926.          ' Td Background 1,20,0,40,30 To POSX-20,POSY-30
  927.          '  End If  
  928.           Extension_4_049E 1,0,0,3,2 To POSX,POSY
  929.       End If 
  930.    Next WEST
  931. Next NORTH
  932. Return 
  933. '===================================================== 
  934. KALASET:
  935. Clear Key 
  936. Autoback 1
  937. KULA0=Colour(0)
  938. KULA1=Colour(1) : KULA2=Colour(2)
  939. KULA3=Colour(3) : KULA4=Colour(4)
  940. KULA5=Colour(5) : KULA6=Colour(6)
  941. KULA7=Colour(7)
  942. '    then 3d obs colour
  943. KULA8=Colour(8)
  944. KULA9=Colour(9) : KULA10=Colour(10)
  945. KULA11=Colour(11) : KULA12=Colour(12)
  946. KULA13=Colour(13) : KULA14=Colour(14)
  947. KULA15=Colour(15)
  948. Gosub SCRNSET
  949. Do 
  950.    MC=Mouse Click
  951.    If MC=1
  952.       'Locate 20,10 : Print X Mouse;" ";(Y Mouse-50)/8 
  953.       TEMMP=((Y Mouse-50)/8)+1 : Rem +1 is to set on this screen  
  954.       WHOLE=Colour(TEMMP)
  955.       Locate 10,9 : Print WHOLE;
  956.       RED=WHOLE/256
  957.       OVER=WHOLE-(RED*256)
  958.       GRN=(OVER)/16
  959.       BLU=OVER-(GRN*16)
  960.       ' Print RED;GRN;BLU;"           "
  961.       ' Print " -";(RED*256)+(GRN*16)+BLU
  962.    End If 
  963.    K$=Inkey$
  964.    If K$="e" Then Exit 
  965.    If K$="w" Then RED=RED+1
  966.    If K$="q" Then RED=RED-1
  967.    If RED>15 Then RED=15
  968.    If RED<0 Then RED=0
  969.    If K$="s" Then GRN=GRN+1
  970.    If K$="a" Then GRN=GRN-1
  971.    If GRN>15 Then GRN=15
  972.    If GRN<0 Then GRN=0
  973.    If K$="x" Then BLU=BLU+1
  974.    If K$="z" Then BLU=BLU-1
  975.    If BLU>15 Then BLU=15
  976.    If BLU<0 Then BLU=0
  977.    Locate 20,10 : Print Hex$(RED);" ";Hex$(GRN);" ";Hex$(BLU);"     ";
  978.    Colour TEMMP,(RED*256)+(GRN*16)+BLU
  979. Loop 
  980. Hide 
  981. Autoback 0
  982. Return 
  983. '==================================================================- 
  984. SCRNSET:
  985. For V=0 To 126 Step 8
  986.    Paper 0 : Pen 1 : Locate 0,(V/8) : Print V/8;
  987.    Ink V/8 : Bar 35,V To 70,V+8
  988. Next V
  989. Screen Swap 
  990. Show 
  991. ' Wait Key 
  992. Return 
  993. '==================================================================
  994. HEADUP:
  995. If HUD=0
  996.    Sprite 2,220,41,3
  997.    Sprite 4,350,41,3
  998.    Sprite 6,281,41,4
  999.    HUD=1
  1000.    Return 
  1001. End If 
  1002. If HUD=1
  1003.    Sprite Off 
  1004.    HUD=0
  1005. End If 
  1006. Return 
  1007. '
  1008. '
  1009. '==================================
  1010. '      /?????
  1011. DSOBS:
  1012. If HAVEOBS=1 Then HAVEOBS=0 : Return 
  1013. If HAVEOBS=0 Then HAVEOBS=1 : Return 
  1014. Return 
  1015. '
  1016. '================================================================
  1017. '                     action on runway 
  1018. RUUNWAY:
  1019. If WZ>150 Then Return 
  1020. '
  1021. If Jleft(1)=-1 Then Add TURN,-60 : Rem for ground turn  
  1022. If Jright(1)=-1 Then Add TURN,60
  1023. '  
  1024. If TAKEOFF=1 and GOING>-2500 and GOING<0 and SPEED<95
  1025.    If WZ<120
  1026.       B=0 : GOING=-100+GOING/2 : ROLL=ROLL/2
  1027.    End If 
  1028.    If WZ<65 : Rem     if not too steep or fast 
  1029.       B=0 : Rem         level out and land 
  1030.       GOING=0 : ROLL=0 : TAKEOFF=0
  1031.    End If 
  1032. End If 
  1033. '
  1034. If SPEED<1
  1035.    If MOREOFF=1 and WZ<65
  1036.       Wait 50
  1037.       FUEL=RAYNG : Rem refuel on successful landing   
  1038.       Ink 6 : Draw 204,160 To 204,180 : Rem fuel bar 
  1039.       Locate 10,5 : Print " refuelling...."
  1040.       Screen Swap 
  1041.       Ink 6 : Draw 204,160 To 204,180 : Rem fuel bar 
  1042.       Wait 200
  1043.       Locate 10,5 : Print " O.K. .. done. "
  1044.       Screen Swap 
  1045.       Wait 100
  1046.       Locate 10,5 : Print "               ."
  1047.       MOREOFF=0
  1048.    End If 
  1049. End If 
  1050. '
  1051. If WZ>65 or WX>107000 or WY>115000 Then TAKEOFF=1 : MOREOFF=1
  1052. Ink 12
  1053. For G=0 To 60
  1054.    SCNX1= Extension_4_0474(LINX(G),LINY(G),0)
  1055.    SCNY1= Extension_4_0480 
  1056.    '
  1057.    If SCNX1>0 and SCNY1>0
  1058.       SCNX2= Extension_4_0474(LINX2(G),LINY(G),0)
  1059.       SCNY2= Extension_4_0480 
  1060.       If SCNX2>0 and SCNY2>0
  1061.          Draw SCNX1,SCNY1 To SCNX2,SCNY2
  1062.       End If 
  1063.    End If 
  1064. Next 
  1065. Return 
  1066. '
  1067. '==============================================================
  1068. '                add lines positions to airstrip arrays
  1069. LINES:
  1070. For G=0 To 69
  1071.    LINX(G)=STX+Rnd(8300)
  1072.    LINY(G)=STY-350+Rnd(600)
  1073.    LINX2(G)=LINX(G)+200+Rnd(200)
  1074.    LINY2(G)=LINY(G)
  1075. Next G
  1076. Return 
  1077. '==========================================================
  1078. '                         if below ground
  1079. KRUNCH:
  1080. Volume %110,63 : Sam Play %110,3,9000
  1081. Volume %1001,0
  1082. Fade 5
  1083. For C=0 To 20
  1084.     Extension_4_053C 
  1085.     Extension_4_018C 0,Q,R,R
  1086.     Extension_4_0318 
  1087.    Screen Swap 
  1088.    Wait Vbl 
  1089.    'Q=Rnd(-200) 
  1090.    R=Rnd(15000)
  1091. Next C
  1092. Cls 1,0,0 To 320,120
  1093. Volume 0
  1094. Sam Play %100,1,15000 : Rem  roar out of sync back on  
  1095. Wait 20
  1096. Locate 13,9 : Print "               "
  1097. Locate 13,10 : Print "   Cruunch!!   "
  1098. Locate 13,11 : Print "  I'm afraid   "
  1099. Locate 13,12 : Print " it's all over "
  1100. Locate 13,13 : Print "               "
  1101. Locate 13,14 : Print "  resetting..  "
  1102. Screen Swap : Wait 200
  1103. Gosub AGAIN
  1104. Gosub CULOR
  1105. Return 
  1106. '================================================================= 
  1107. '             move hit targets and remove from map and arrays
  1108. TIDY:
  1109. If CLONK=19
  1110.    BANG=1 : Wait 1 : Rem and any other plane hitstuff.. improve?! 
  1111.    Inc ENMGOT : Rem why is the   wait   above??
  1112.    AWK=(Rnd(4)-2)*100 : If AWK=0 : AWK=200 : End If 
  1113.     Extension_4_00D4 19,0,0,AWK
  1114.     Extension_4_018C 19,0,AWK*80,0
  1115.    EBNK=EBNK-AWK*80
  1116.    If ENMGOT=2
  1117.       If TYMUP>-80
  1118.          TYMUP=TYMUP-90 : Rem to  delay replacing targets as well  
  1119.       End If 
  1120.       If FAROUT>-320
  1121.         FAROUT=FAROUT-330 : Rem to  delay return of plane  
  1122.       End If 
  1123.       Inc ENMHITS
  1124.       GOTCHA=1
  1125.    End If 
  1126.    Return 
  1127. End If 
  1128. '
  1129. TEMPX= Extension_4_0114(CLONK)/5000
  1130. TEMPY= Extension_4_0128(CLONK)/5000
  1131. If OBN(TEMPX,TEMPY)<>8 Then Return : Rem if not target
  1132. '
  1133. BANG=1 : Rem so there's an explosion  
  1134. OBN(TEMPX,TEMPY)=65 : Rem   so it can be identified to replace 
  1135.  Extension_4_00EC CLONK,0,0,500000 : Rem  move target out of sight till next replace  
  1136. Screen 4
  1137. Ink 13
  1138. Plot TEMPY,40-TEMPX : Rem  blot out target on  bob source  
  1139. '
  1140. Gosub STATE : Rem to  save hit position in order for time based replace  
  1141. Get Bob 4,24,0,0 To 56,42 : Rem get new bob with target removed
  1142. Screen 3
  1143. '
  1144. For G=0 To ACOUNT : Rem move target out of sight in source target array  
  1145.    If TARGX(G)=OBX(TEMPX,TEMPY)
  1146.       TARGX(G)=990000
  1147.    End If 
  1148. Next G
  1149. Return 
  1150. '========================================================= 
  1151. '            to restore targets to large original array      
  1152. RETARGET:
  1153. For X=0 To 40
  1154.    For Y=0 To 40
  1155.       If OBN(X,Y)=65
  1156.          OBN(X,Y)=8
  1157.       End If 
  1158.    Next 
  1159. Next 
  1160. Return 
  1161. '=================================== 
  1162. '          to  reset to runway or after crash  
  1163. AGAIN:
  1164.  Extension_4_00EC 19,0,0,3000
  1165.  Extension_4_01A6 0,RT3,0,STC : SPEED=0
  1166.  Extension_4_00EC 0,STX,STY,STZ : ROLL=0 : TURN=STC : GOING=0 : C1=0 : FUEL=RAYNG
  1167. C2=0 : B=0 : A=0 : MORETURN=0 : POWER=0 : DROP=0 : TAKEOFF=0 : MAPTYPE=0
  1168. ENMGOT=0 : ENMHIT=0 : DAMAGE=0 : RELSCALE=5000
  1169. MOREOFF=0 : TYMUP=0 : TRACK=0
  1170. For FT=0 To 12 Step 4
  1171.    Colour 17+FT,$555 : Rem  sprite colour 
  1172.    Colour 18+FT,$0 : Rem  odd blue bit? 
  1173.    Colour 19+FT,$0 : Rem  
  1174. Next 
  1175. Autoback 1 : Locate 5,20 : Print TIMEBETWEEN;" "
  1176. Ink 6 : Draw 204,160 To 204,180 : Rem fuel bar 
  1177. Autoback 0
  1178. Gosub RETARGET
  1179. Gosub MAKETARGET
  1180. Gosub DETAILMAP
  1181. HOLD=1
  1182. Return 
  1183. '
  1184. '================================================================
  1185. '                to update map if target hit 
  1186. MAPTARG:
  1187. Screen 4
  1188. Get Bob 4,24,0,0 To 56,42
  1189. Return 
  1190. '=========================================================== 
  1191. '                    reset roll attitude of enemy plane  
  1192. PLANEADJUST:
  1193. '
  1194. EBNK=EBNK+ECHNG
  1195. If EBNK>ELIMIT Then EBNK=ELIMIT
  1196. If EBNK<-ELIMIT Then EBNK=-ELIMIT
  1197. EHEAD= Extension_4_01E4(19)-(EBNK/20) : Rem ehead is world direction 
  1198.  Extension_4_01A6 19,RT1,RT2+EBNK,EHEAD
  1199. If GOTCHA=1 Then Extension_4_018C 19,-4000,0,0
  1200.  Extension_4_0100 19,ENEMYSPEED+BOOST
  1201. If Extension_4_013C(19)<-300
  1202.    GOTCHA=0
  1203.    ENMGOT=0
  1204.     Extension_4_00EC 19,-800000,-800000,3000
  1205. End If 
  1206. Return 
  1207. '
  1208. '======================================================================= 
  1209. NEWPLANE: Rem     to set plane incoming from random position 
  1210.  Extension_4_00EC 19,100000,100000,300+Rnd(4000)
  1211. EHEAD=Rnd(65000)
  1212.  Extension_4_01A6 19,RT1,RT2,EHEAD
  1213.  Extension_4_0100 19,-60000 : Rem should point to centre 
  1214. EBNK=0 : ECHNG=0 : Rem set level
  1215. ECHECK=80+Rnd(80) : Rem min frames inward before change 24000vdu + rnd   
  1216. ENMGOT=0
  1217. Return 
  1218. '==============================================================  
  1219. ENEW:
  1220. ECHECK=3+Rnd(15) : Rem    frames before  change   
  1221. ECHNG=Rnd(2000)-1000 : Rem   rate of change 
  1222. Return 
  1223. '====================================================================
  1224. '          rel map for airborne  target  and airport 
  1225. RELMAP:
  1226. EN1X= Extension_4_0114(19)
  1227. EN1Y= Extension_4_0128(19)
  1228.  Extension_4_01A6 0,RT3,0,CAT
  1229. MAPX1= Extension_4_0454(0,EN1X,EN1Y,0)/2000
  1230. MAPY1= Extension_4_0408 /2000
  1231. If MAPX1>20 Then MAPX1=20
  1232. If MAPX1<-20 Then MAPX1=-20
  1233. If MAPY1>20 Then MAPY1=20
  1234. If MAPY1<-20 Then MAPY1=-20
  1235. APX1= Extension_4_0454(0,AIRX,AIRY,0)/2000
  1236. APY1= Extension_4_0408 /2000
  1237. If APX1>20 Then APX1=20
  1238. If APX1<-20 Then APX1=-20
  1239. If APY1>20 Then APY1=20
  1240. If APY1<-20 Then APY1=-20
  1241. Paste Bob 90,150,25
  1242. Ink 7 : Plot 110+APY1,170-APX1
  1243. If BOOST=0 Then Ink 15 : Plot 110+MAPY1,170-MAPX1
  1244. TEMPP=POWER/4
  1245. Ink 15 : Draw 180,180 To 180,180-TEMPP
  1246. Ink 1
  1247. Draw 204,159 To 204,USEFUEL : Rem fuel bar 
  1248. Draw 180,158 To 180,179-TEMPP
  1249. '
  1250. Screen Swap 
  1251. Paste Bob 90,150,25
  1252. Ink 7 : Plot 110+APY1,170-APX1
  1253. If BOOST=0 Then Ink 15 : Plot 110+MAPY1,170-MAPX1
  1254. Ink 15 : Draw 180,180 To 180,180-TEMPP
  1255. Ink 1
  1256. Draw 204,159 To 204,USEFUEL : Rem fuel bar 
  1257. Draw 180,158 To 180,179-TEMPP
  1258. '
  1259. Screen Swap 
  1260.  Extension_4_01A6 0,AAT,BAT,CAT
  1261. Return 
  1262. '==============================================================  
  1263. '            to make targets  array  for ground relmap     
  1264. MAKETARGET:
  1265. ACOUNT=0
  1266. For X=0 To 40
  1267.    For Y=0 To 40
  1268.       If OBN(X,Y)=8
  1269.          TARGX(ACOUNT)=OBX(X,Y)
  1270.          TARGY(ACOUNT)=OBY(X,Y)
  1271.          Inc ACOUNT
  1272.          If ACOUNT>20
  1273.             Cls 
  1274.             Locate 0,4
  1275.             Print "this data has more than 20 targets"
  1276.             Print "- won't work on this program!"
  1277.             Volume 0
  1278.             Screen Swap 
  1279.             Wait 100
  1280.             End 
  1281.          End If 
  1282.       End If 
  1283.    Next 
  1284. Next 
  1285. Return 
  1286. '=================================== 
  1287. '                   draw rel view map for ground targets 
  1288. RELTARGETS:
  1289. Autoback 1
  1290. If RELSCALE=5000 Then USEBOB=27
  1291. If RELSCALE=3500 Then USEBOB=26
  1292. If RELSCALE=2000 Then USEBOB=25
  1293. Paste Bob 90,150,USEBOB
  1294. TEMPP=POWER/4
  1295. Ink 15 : Draw 180,180 To 180,180-TEMPP
  1296. Ink 1 : Draw 204,159 To 204,USEFUEL : Rem fuel bar 
  1297. Draw 180,158 To 180,179-TEMPP
  1298. '
  1299. '
  1300.  Extension_4_01A6 0,RT3,0,CAT
  1301. Ink 15
  1302. For P=0 To ACOUNT-1
  1303.    If TARGX(P)<900000
  1304.       MPX= Extension_4_0454(0,TARGX(P),TARGY(P),0)/RELSCALE
  1305.       MPY= Extension_4_0408 /RELSCALE
  1306.       If MPX>20 : MPX=20 : End If 
  1307.       If MPX<-20 : MPX=-20 : End If 
  1308.       If MPY>20 : MPY=20 : End If 
  1309.       If MPY<-20 : MPY=-20 : End If 
  1310.       Plot 110+MPY,170-MPX
  1311.       TMPY(P)=110+MPY : TMPX(P)=170-MPX
  1312.    End If 
  1313. Next 
  1314.  Extension_4_01A6 0,AAT,BAT,CAT
  1315. Autoback 0
  1316. Return 
  1317. '========================================================= 
  1318. LOSE:
  1319. Locate 0,0
  1320. Print "         Whoops,  curses.            "
  1321. Print "   They wiped out your defences      "
  1322. Print "        But then,  who cares?        "
  1323. Print "                                     "
  1324. Print "       Hit a key to restart          "
  1325. Screen Swap 
  1326. Wait Key 
  1327. DAMAGE=0
  1328. Gosub AGAIN
  1329. Return 
  1330. '=================================================================== 
  1331. '                            for explosion 
  1332. YAY:
  1333. If GUH<MISSTEP and GUH>0
  1334.    NEEDX= Extension_4_0114(1)
  1335.    NEEDY= Extension_4_0128(1)
  1336.    NEEDZ= Extension_4_013C(1)
  1337.    USEX= Extension_4_0474(NEEDX,NEEDY,NEEDZ)
  1338.    USEY= Extension_4_0480 
  1339.    If USEX>0 and USEY>0
  1340.       '
  1341.       For H=0 To 30
  1342.          TEMPX=USEX-45+Rnd(90)
  1343.          TEMPY=USEY-20+Rnd(40)
  1344.          If TEMPY<125 and TEMPY>1 and TEMPX<319 and TEMPX>1
  1345.             Plot TEMPX,TEMPY,Rnd(16)
  1346.          End If 
  1347.       Next 
  1348.       For H=0 To 50
  1349.          TEMPX=USEX-20+Rnd(40)
  1350.          TEMPY=USEY-12+Rnd(24)
  1351.          If TEMPY<125 and TEMPY>1 and TEMPX<319 and TEMPX>1
  1352.             Plot TEMPX,TEMPY,Rnd(16)
  1353.          End If 
  1354.       Next 
  1355.    End If 
  1356.    Volume %110,63 : Sam Play %110,3,9000 : WHOLD=13
  1357.    BANG=0
  1358.     Extension_4_0090 1 : GUH=0 : Rem kill missile and turn off move check   
  1359. End If 
  1360. '
  1361. Return 
  1362. '======================================================================= 
  1363. '            to find and make permanent  air strip object number 18  
  1364. AIR:
  1365. For X=0 To 40
  1366.    For Y=0 To 40
  1367.       If OBN(X,Y)=10
  1368.          GRIEFX=OBX(X,Y) : GRIEFY=OBY(X,Y) : GRIEFC=CAN(X,Y)
  1369.          'Td Object 18,OBS$(10),OBX(X,Y),OBY(X,Y),0,RT1,RT2,CAN(X,Y)
  1370.          OBN(X,Y)=40
  1371.       End If 
  1372.    Next 
  1373. Next 
  1374. Return 
  1375. '======================================================================  
  1376. '                   comes here if enemy outside map limits 
  1377. CHANGE:
  1378. '                      
  1379. ECHECK=200 : EBNK=0 : ECHNG=0 : Rem  set plane level and accelerate  
  1380. BOOST=600
  1381.  Extension_4_01A6 19,RT1,RT2,EHEAD : Rem keep heading out 
  1382. Inc FAROUT
  1383. '
  1384. If FAROUT>TIMEBETWEEN : Rem then new plane 
  1385.    BOOST=0
  1386.    FAROUT=0
  1387.    Gosub NEWPLANE
  1388. End If 
  1389. Return 
  1390. '====================================================================
  1391. '                         record grid position of hit target 
  1392. STATE:
  1393. STATEX(TRACK)=TEMPX
  1394. STATEY(TRACK)=TEMPY
  1395. Inc TRACK : Rem this tells how many targets hit
  1396. Return 
  1397. '========'=============================================================' 
  1398. '                    to replace earliest hit target
  1399. '                  
  1400. RESTATE:
  1401. Inc TYMUP
  1402. If TYMUP>DIFFICULTY and TRACK>1 : Rem  track for don't if not 2 done 
  1403.    TYMUP=0
  1404.    '        difficulty is harder as time between  replace is less 
  1405.    XT=STATEX(0) : YT=STATEY(0) : Rem earliest set grid location 
  1406.    OBN(XT,YT)=8 : Rem set source(large) obn array to be a target again 
  1407.    '    
  1408.    For Z=0 To TRACK : Rem     move all hit data back one 
  1409.       STATEX(Z)=STATEX(Z+1)
  1410.       STATEY(Z)=STATEY(Z+1)
  1411.    Next 
  1412.    Dec TRACK
  1413.    '
  1414.    For G=0 To ACOUNT : Rem replace target  in the seperate target array   
  1415.       If TARGY(G)=OBY(XT,YT)
  1416.          TARGX(G)=OBX(XT,YT)
  1417.       End If 
  1418.    Next 
  1419.    '
  1420.    Screen 4
  1421.    Ink 15
  1422.    Plot YT,40-XT
  1423.    Get Bob 4,24,0,0 To 56,42 : Rem get new bob with earliest target replaced  
  1424.    Screen 3
  1425. End If 
  1426. Return 
  1427. '============================================================
  1428. WIN:
  1429. Locate 0,0
  1430. Print "    YEEEEES!!,  you got em all!      "
  1431. Print "                                     "
  1432. Print "     hit a key to restart on         "
  1433. Print "      greater difficulty             "
  1434. Print "                                     "
  1435. Print "                                     "
  1436. Screen Swap 
  1437. Volume 0
  1438. WINN=0
  1439. 'DIFFICULTY=DIFFICULTY-25
  1440. TIMEBETWEEN=TIMEBETWEEN-20 : Rem enemy damage increases as result 
  1441. If TIMEBETWEEN<0 Then TIMEBETWEEN=0
  1442. Wait Key 
  1443. K$="f"
  1444. Gosub AGAIN
  1445. Return 
  1446. '========================================================================
  1447. HITBITS:
  1448. NEDX= Extension_4_0114(19)
  1449. NEDY= Extension_4_0128(19)
  1450. NEDZ= Extension_4_013C(19)
  1451. ETX= Extension_4_0474(NEDX,NEDY,NEDZ)
  1452. ETY= Extension_4_0480 
  1453. Ink 13
  1454. If ETX>-1 and ETY>-1
  1455.    For X=0 To 20
  1456.       E1=ETX+Rnd(20)-10
  1457.       E2=ETY+Rnd(20)-10
  1458.       If E1>-1 and E2>-1 and E2<HYTE : Plot E1,E2 : End If 
  1459.    Next 
  1460. End If 
  1461. Return 
  1462. '================================================
  1463. WHATSUP:
  1464.  Cls 0,0,0 To 320,120
  1465. Locate 0,0
  1466. Paper 0
  1467. Pen 2
  1468. Print "    flight controls on joystick   "
  1469. Print "  rocket launch               fire"
  1470. Print "  add power                       A"
  1471. Print "  reduce power                    S"
  1472. Print "          "
  1473. Print "  normal map                      1"
  1474. Print "  relative map- airstrip + enemy  2"
  1475. Print "  relative map- grnd. targets     3"
  1476. Print "  zoom map 3     up .. Z,  down.. X"
  1477. Print "  Reset to  runway                R"
  1478. Print "  pause                           P"
  1479. Print "  stop with sound loop OFF !#     C "
  1480. Print "       others  in  readme"
  1481. Print "       hit key to continue"
  1482. Print 
  1483. Wait Key 
  1484. Return